home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / alib / amigalib / createtask.c < prev    next >
C/C++ Source or Header  |  1994-02-18  |  1KB  |  55 lines

  1.  
  2. /*
  3.  *  CREATETASK.C
  4.  *
  5.  *
  6.  *  in-memory:    [memList][stack][Task]
  7.  */
  8.  
  9. #include <exec/types.h>
  10. #include <exec/memory.h>
  11. #include <exec/tasks.h>
  12. #include <clib/exec_protos.h>
  13. #include <clib/alib_protos.h>
  14.  
  15. typedef struct MemList MemList;
  16. typedef struct Task    Task;
  17.  
  18. Task *
  19. CreateTask(name, pri, initPC, stackSize)
  20. unsigned char *name;
  21. long pri;
  22. APTR initPC;
  23. unsigned long stackSize;
  24. {
  25.     MemList *memList;
  26.     Task    *task = NULL;
  27.     long    totalSize;
  28.  
  29.     stackSize = (stackSize + 3) & ~3;
  30.     totalSize = sizeof(MemList) + sizeof(Task) + stackSize;
  31.  
  32.     if (memList = AllocMem(totalSize, MEMF_PUBLIC|MEMF_CLEAR)) {
  33.     memList->ml_NumEntries = 1;
  34.     memList->ml_ME[0].me_Addr = (APTR)(memList + 1);
  35.     memList->ml_ME[0].me_Length = totalSize - sizeof(MemList);
  36.  
  37.     task = (struct task *)memList + sizeof(MemList) + stackSize;
  38.     task->tc_Node.ln_Pri  = pri;
  39.     task->tc_Node.ln_Type = NT_TASK;
  40.     task->tc_Node.ln_Name = name;
  41.     task->tc_SPLower = (char *)memList + sizeof(MemList);
  42.     task->tc_SPUpper = (char *)task->tc_SPLower + stackSize;
  43.     task->tc_SPReg     = task->tc_SPUpper;
  44.     NewList(&task->tc_MemEntry);
  45.     AddTail(&task->tc_MemEntry, &memList->ml_Node);
  46.     if (AddTask(task, initPC, NULL) == 0) {
  47.         FreeEntry(memList);
  48.         task = NULL;
  49.     }
  50.     }
  51.     return(task);
  52. }
  53.  
  54.  
  55.